import matplotlib
from PySide6.QtGui import QPainter, QResizeEvent
matplotlib.use("QtAgg")  # 使用 Qt 后端（兼容 PySide6）
from PySide6.QtCore import QCoreApplication
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from PySide6.QtWidgets import QGraphicsScene

class MatplotlibCanvas(FigureCanvas):
    #将 matplotlib 图像嵌入到 PySide6 的 QGraphicsView 中，
    #支持窗口缩放自适应，并提供语言/字体切换能力。

    def __init__(self, graphics_view):
        # 初始化时，先设置默认中文字体，防止中文字符显示方框
        plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
        plt.rcParams['axes.unicode_minus'] = False  # 负号正常显示

        # 创建 Figure 容器和子图
        self.fig = Figure(figsize=(5, 4), dpi=100)
        self.axes = self.fig.add_subplot(111)

        super().__init__(self.fig)  # 父类构造

        # 在 QGraphicsScene 中嵌入该 Canvas
        self.scene = QGraphicsScene()
        self.scene.addWidget(self)

        # 关联到外部传入的 QGraphicsView
        graphics_view.setScene(self.scene)
        graphics_view.setRenderHint(QPainter.Antialiasing)
        graphics_view.setSceneRect(self.rect())

        # 默认隐藏坐标轴
        self.axes.set_xticks([])
        self.axes.set_yticks([])
        # 设置标题（中文默认）
        self._update_title()

        # 保持 X/Y 比例
        self.axes.set_aspect('equal', adjustable='box')

        # 绘制
        self.draw()

        # 监听 QGraphicsView 的 resizeEvent
        graphics_view.resizeEvent = self._on_view_resized
        self.graphics_view = graphics_view

    def _update_title(self):
        """更新标题文字，使用 QCoreApplication.translate 获取翻译。"""
        title_text = QCoreApplication.translate("MatplotlibCanvas", "扫描热力图")
        self.axes.set_title(title_text, fontsize=12)

    def _on_view_resized(self, event: QResizeEvent):
        """当 QGraphicsView 大小变化时，自适应 Canvas 大小。"""
        new_size = event.size()
        self.resize(new_size)
        self.graphics_view.setSceneRect(0, 0, new_size.width(), new_size.height())
        self.draw()

    def retranslate_canvas(self, lang_code: str):
        #在语言切换后调用，重新设置字体（根据语言），并刷新标题。
        # lang_code "zh_CN", "en_US", "ja_JP", etc.
        # 根据语言选择合适的字体，防止乱码
        if lang_code.startswith("zh"):
            plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
        elif lang_code.startswith("ja"):
            # 日文可尝试 'Yu Gothic' 或 'Meiryo' 等
            plt.rcParams['font.sans-serif'] = ['Yu Gothic', 'Meiryo', 'Arial Unicode MS']
        elif lang_code.startswith("ko"):
            # 韩文可尝试 'Malgun Gothic' 等
            plt.rcParams['font.sans-serif'] = ['Malgun Gothic', 'Arial Unicode MS']
        else:
            # 其他语言：英文、等等，采用 'Arial' 或 DejaVu Sans
            plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans']

        # 再次更新负号显示
        plt.rcParams['axes.unicode_minus'] = False

        # 重新设置标题文字
        self._update_title()

        # 重新绘制
        self.draw()
